// 给定一个非负整数数组，你最初位于数组的第一个位置。

// 数组中的每个元素代表你在该位置可以跳跃的最大长度。

// 你的目标是使用最少的跳跃次数到达数组的最后一个位置。

// 假设你总是可以到达数组的最后一个位置。

// 边界条件过多，特殊用例导致结果不符
var jump = function(nums) {
    let li = 0;
    let long = nums[0];
    let con = 0;
    while (li < nums.length - 1) {
        if (long == 1) {
            li++;
            con++;
            if (li == nums.length - 1) {
                return con;
            }
        }
        for (let i = 1; i < long; i++) {
            var max = Math.max(nums[li], nums[li + i])
        };
        long = max;
        li += long;
        con++;
    }
    return con;
};
var jump = function(nums) {
    let n = nums.length
    let start = 0 // 根据起点start<i<end 这个起跳点范围，我们每次取最大的，然后依次做这样的筛选操作
    let end = 0 // end才是衡量跳的位置  start是用来筛选范围格子内可以跳跃的最远距离
    let maxPos = 0
    let ans = 0
        // 终点是n-1 我们的的步数满足n-1就到达目的
    while (end < n - 1) {
        // 如果某一个作为 起跳点 的格子可以跳跃的距离是 3，那么表示后面 3 个格子都可以作为 起跳点
        // 我们依次去判断起跳点能跳到的最远位置
        // 对每一次 跳跃 用 for 循环来模拟
        for (let i = start; i <= end; i++) {
            // 能跳到最远的距离的位置
            // nums[i]+i===>当前位置+可以跳的步数
            maxPos = Math.max(maxPos, nums[i] + i)
        }
        // 为什么是end+1 因为前面的格子已经筛选出最远的跳远距离
        start = end + 1 // 下一次起跳点范围开始的格子
        end = maxPos // 下一次起跳点范围结束的格子
        ans++
    }
    return ans
};

// 2 3 1 1 4 
// maxPos= 2 start=1 end=2